package com.binc.testspring.common.filter;

import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 *
 * Description: 自定义的过滤器
 *
 * <p><pre>这段代码的逻辑比较简单，就是在方法执行前先记录时间戳，然后通过过滤器链完成请求的执行，在返回结果之间计算执行的时间。
 * 这里需要主要，这个类必须继承Filter类，这个是Servlet的规范，这个跟以前的Web项目没区别。
 * 但是，有了过滤器类以后，以前的web项目可以在web.xml中进行配置，
 * 但是spring boot项目并没有web.xml这个文件，那怎么配置？
 * 在Spring boot中，我们需要FilterRegistrationBean来完成配置。 </pre>
 *
 *         1 通过FilterRegistrationBean来配置过滤器!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 *  *      2 不用配置，直接在自定义过滤器上用注解来玩；（不用配置类）  @WebFilter(urlPatterns = "/*", filterName = "logFilter2")!!!!!!!!!!!!!!
 *
 * <p> 现在项目的配置都在com.binc.testspring.common.config.WebMvcConfig中；
 * </p>
 *
 */
/*
如果在自定义过滤器的类上添加这个注解，那过滤器可以用做配置类的一些列配置了，干的活都一样
            实例化Filter类，
            然后指定url的匹配模式，
            设置过滤器名称和执行顺序，

这里直接用@WebFilter就可以进行配置，同样，可以设置url匹配模式，过滤器名称等。
这里需要注意一点的是@WebFilter这个注解是Servlet3.0的规范，并不是Spring boot提供的。
除了这个注解以外，我们还需在配置类中加另外一个注解：@ServletComponetScan，指定扫描的包。(加载任何一个配置类或者启动类上都行)

 注意：这种方式我们并没有指定执行的顺序。这里需要解释一下，@WebFilter这个注解并没有指定执行顺序的属性，其执行顺序依赖于Filter的名称，
 是根据Filter类名（注意不是配置的filter的名字）的字母顺序倒序排列，并且@WebFilter指定的过滤器优先级都高于FilterRegistrationBean配置的过滤器。

 */
@Order(1) // 如果有多个 Filter ，则序号越小 ，越旱被执行（这个没有试验过，并且这个spring核心包的并不是springboot的// ）
@WebFilter(urlPatterns = "/*", filterName = "logFilter2")
public class BincFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Execute cost="+(System.currentTimeMillis()-start));
    }

    @Override
    public void destroy() {

    }

}
